package br.edu.delta.model;

import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import br.edu.delta.util.Util;

/**
 * <p>
 * <b>Title:</b> Emprestimo
 * </p>
 * 
 * <p>
 * <b>Description:</b> Emprestimo
 * </p>
 * 
 * <p>
 * <b>Company: </b>
 * </p>
 * 
 * @author Denis
 * 
 * @version 1.0.0
 */
@Entity
@Table(name = "tbl_emprestimos")
@SequenceGenerator(name = EntidadeImpl.SEQUENCE_GENERATOR, sequenceName = "seq_tbl_emprestimos", allocationSize = 1, initialValue = 1)
public class Emprestimo extends EntidadeImpl {

	/** Atributo serialVersionUID. */
	private static final long serialVersionUID = -7160982363065678133L;

	/** Atributo dataMaximaDevolucao. */
	@Column(insertable = true, unique = false, updatable = true, nullable = false, name = "DT_MAXIMA_DEVOLUCAO")
	@Temporal(TemporalType.DATE)
	private Date dataMaximaDevolucao;

	/** Atributo livros. */
	@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL}, targetEntity = Livro.class)
	@JoinTable(name = "tbl_emprestimo_livro", 
	joinColumns = { @JoinColumn(name = "EMPRESTIMO_ID", nullable = false, updatable = false) } , 
	inverseJoinColumns = { @JoinColumn(name = "LIVRO_ID", nullable = false, updatable = false) })
	private Set<Livro> livros;
	
	/** Atributo leitor. */
	@NotNull
	@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH }, optional = false, targetEntity = Leitor.class)
	@JoinColumn(insertable = true, unique = false, name = "id_leitor", updatable = true, nullable = false)
	private Leitor leitor;
	
	/** Atributo devolucaoList. */
	@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, mappedBy = "emprestimo", targetEntity = Devolucao.class)
	private Collection<Devolucao> devolucaoList;

	/**
	 * Retorna o valor do atributo <code>dataMaximaDevolucao</code>
	 * 
	 * @return <code>Date</code>
	 */
	public Date getDataMaximaDevolucao() {

		return dataMaximaDevolucao;
	}

	/**
	 * Define o valor do atributo <code>dataMaximaDevolucao</code>.
	 * 
	 * @param dataMaximaDevolucao
	 */
	public void setDataMaximaDevolucao(Date dataMaximaDevolucao) {

		this.dataMaximaDevolucao = dataMaximaDevolucao;
	}

	/**
	 * Retorna o valor do atributo <code>leitor</code>
	 * 
	 * @return <code>Leitor</code>
	 */
	public Leitor getLeitor() {

		if (Util.isNull(this.leitor)) {

			this.leitor = new Leitor();
		}

		return leitor;
	}

	/**
	 * Define o valor do atributo <code>leitor</code>.
	 * 
	 * @param leitor
	 */
	public void setLeitor(Leitor leitor) {

		this.leitor = leitor;
	}

	/**
	 * Retorna o valor do atributo <code>livros</code>
	 * 
	 * @return <code>Set<Livro></code>
	 */
	public Set<Livro> getLivros() {
		
		if (Util.isNull(this.livros)) {

			this.livros = new HashSet<Livro>();
		}
		
		return livros;
	}

	/**
	 * Define o valor do atributo <code>livros</code>.
	 * 
	 * @param livros
	 */
	public void setLivros(Set<Livro> livros) {

		this.livros = livros;
	}

}
